perm filename EXPIO.FAI[MUS,LCS] blob sn#314536 filedate 1977-11-01 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE EXPIO 
C00014 ENDMK
C⊗;
	TITLE EXPIO 
	INTERNAL PUTEXT,EXTOUT,GETEXT,EXTIN,FINEXT
; WRITES AND READS DUMP MODE FILES WITH ANY EXTENSION.
	INTERNAL GETTAP,TOTAPE,FINTAP,BACKSP
	INTERNAL GETINF,RDSMPL,getin2,getin3,getin4,rdsmp2,rdsmp3,rdsmp4
  	EXTERNAL INFILE,INFIL2,INFIL3,INFIL4
	ch1←11			;CAN READ 4 FILES AT ONCE
	ch2←12
	CH3←13
	ch4←14
	CH←4		;FOR PUTEXT
	CHG←5 		;FOR GETEXT

;CALL TOTAPE(<ARRAY>,<NO.OF WORDS>)  WRITES ON MAGTAPE

TOTAPE:	0
	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVN 0,@1(16)
	HRLM 0,COM
	OUTPUT CH,COM
	STATZ CH,740000
	0
	JRA 16,2(16)

;CALL GETTAP

GETTAP:	0	;USES INTAP OR TOTAPE, CH.  READS OR WRITES MTA0.
	INIT CH,617
	SIXBIT/MTA0/
	0
	HALT
	JRA 16,0(16)


COM:	OCT 0,0
COM1:	0
BLKNUM:	0

FINTAP:	0
	CLOSE CH,0
	STATZ CH,740000
	0
	RELEASE CH,0
	JRA 16,0(16)

BACKSP:	0
	INIT CH,617
	SIXBIT/MTA0/
	0
	HALT
	MTAPE CH,7
	JRA 16,0(16)

;****** THIS IS FOR READING SOUND SAMPLE FILES INTO THE MUSIC PROGRAM.
;****** A FILE CALLED 'READ[MUS,LCS]' MUST BE ENTERED INTO 'MUS10' IN
;****** ORDER TO USE THIS FEATURE.  SEE 'USEMUS.LCS[UP,DOC]' FOR INFO.

DEFINE ERROR (MSG)
<	JSA 16,.ERROR
	JUMP [ASCIZ/MSG/
]
>

;CALL GETINF(ARRAY J,INSR,INBT,INCH,INMX,INDR,INFILE)
GETINF:	0		;************ INITS FILE AND READS HEADER
	INIT CH1,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	jfcl
	MOVE 0,INFILE		;GET INPUT FILE NAME
	PUSHj 17,intf4
	LOOKUP CH1,DIR
	HALT
	PUSHJ 17,GETF3
	INPUT CH1,COM
	STATZ CH1,740000
	0
	JRST GETHD

GETIN2:	0
	INIT CH2,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	jfcl
	MOVE 0,INFIL2		;GET INPUT FILE NAME 2
	PUSHj 17,intf4
	LOOKUP CH2,DIR
	HALT
	PUSHJ 17,GETF3
	INPUT CH2,COM
	STATZ CH2,740000
	0
	JRST GETHD

GETIN3:	0
	INIT CH3,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	jfcl
	MOVE 0,INFIL3		;GET INPUT FILE NAME 3
	PUSHj 17,intf4
	LOOKUP CH3,DIR
	HALT
	PUSHJ 17,GETF3
	INPUT CH3,COM
	STATZ CH3,740000
	0
	JRST GETHD

GETIN4:	0
	INIT CH4,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	jfcl
	MOVE 0,INFIL4		;GET INPUT FILE NAME 4
	PUSHj 17,intf4
	LOOKUP CH4,DIR
	HALT
	PUSHJ 17,GETF3
	INPUT CH4,COM
	STATZ CH4,740000
	0

GETHD:	MOVE 2,COM		;LOCATION OF INPUT ARRAY
	HRRZ 0,2(2)		;SECOND WD OF ARRAY = SRATE
	FLTR 0,0
	MOVEM 0,@1(16) 		;INSR
	HRRZ 0,3(2)
	FLTR 0,0
	MOVEM 0,@2(16)		;INBT    BITS   0=12, 1=18
	FLTR 0,4(2)
	MOVEM 0,@3(16)		;INCH    NCHNS
;;	FLTR 0,5(2)
	MOVE 0,5(2)
;;;	CAML 0,[=500000]	;IS IT FLOATING?
;;;	KIFIX 0,0			; YES, FIX IT.
	MOVEM 0,@4(16)		;INMX    MAXAMPL
	FLTR 0,6(2)		;LOOK FOR SAMPLE COUNT IN 6TH WD.
	JUMPN 0,SMPLS		;IF ZERO THEN FIGURE IT FROM WDCNT
;;;	MOVE 0,DIR+5		;IRCAM WDCNT
	MOVS 0,DIR+3
	MOVNS 0			;GETS THE WDCNT AT STANFORD
	SUBI 0,=128		;SUBTRACT HEADER LENGTH
	MOVEI 1,3 
	SKIPE @2(16)		; BITS, 0 OR 1?
	SOJ 1,			; BITS = 1, CHANGE MULTIPLIER TO 2
	IMUL 0,1
	FLTR 0,0
SMPLS:	MOVEM 0,@5(16)		;INDR   SAMPLE COUNT
	JRA 16,6(16)


;;INTF4:	MOVE 0,INFILE
INTF4:	MOVEM 0,FILNAM#
	MOVE 1,[POINT 7,@FILNAM]
INTF3:	MOVE 2,[POINT 6,DIR]
	SETZM DIR
;;INTF3:	MOVE 2,[POINT 6,DIR+2]   ;THIS FOR IRCAM
;;	SETZM DIR+2
	MOVEI 3,5      ;****** 5-LETTER NAMES ONLY FOR NOW ********
INTF1:	ILDB 0,1
	JUMPE 0,INTF2
	CAIN 0," "
	JRST INTF2
	SUBI 0,40
	IDPB 0,2
	SOJG 3,INTF1

INTF2:	MOVE 0,[SIXBIT/SND/]	;SND IS ONLY ACCEPTABLE EXTENSION.
	MOVEM 0,DIR+1
	SETZM DIR+2
	SETZM DIR+3		;ZERO THESE SO PPN IS OK ON RERUNS.
;;	MOVEM 0,DIR+3 	; FOR IRCAM
;;	SETZM DIR+4
;;	SETZM DIR+1
	POPJ 17,

GETF3:	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVNI 0,=128 
	HRLM 0,COM
	POPJ 17,

DIR:	5
	BLOCK 5

;CALL RDSMPL(<ARRAY>,BITS)   BITS=1536(12-BIT) OR 1024(18-BIT)
RDSMPL:	0		  ;************** READS THE SAMPLES
	PUSHJ 17,SETCOM
	INPUT CH1,COM
	STATZ CH1,740000
	0
	JRST RDARY

RDSMP2:	0
	PUSHJ 17,SETCOM
	INPUT CH2,COM
	STATZ CH2,740000
	0
	JRST RDARY

RDSMP3:	0
	PUSHJ 17,SETCOM
	INPUT CH3,COM
	STATZ CH3,740000
	0
	JRST RDARY

RDSMP4:	0
	PUSHJ 17,SETCOM
	INPUT CH4,COM
	STATZ CH4,740000
	0


RDARY:	SETZ 5,		;THE COUNTER
	MOVE 1,(16)	;FIRST LOCATION OF ARRAY
;;	MOVE 6,INARY    	;1025TH LOC OF ARRAY (LAST 1/3)
	KIFIX 0,@1(16)		;BITS, 0 OR 1
	MOVEI 4,3	;12-BIT
	SUB 4,0		; 18-BIT IF AC ZERO IS 1
UNPAC:	AOJ 6,		;MOVE INPUT POINTER
	MOVE 2,(6)	;BEGINNING OF LOOP
	JUMPN 0,HALFWD 	;JUMP IF 18-BIT
	LSHC 2,-14	; FOR 12 BIT
	ASH 3,-30
	FLTR 3,3	;ALL SAMPLES MUST BE IN FLOATING POINT.
	MOVEM 3,2(1)
	LSHC 2,-14
	ASH 3,-30
	FLTR 3,3	;ALL SAMPLES MUST BE IN FLOATING POINT.
	MOVEM 3,1(1)
	LSHC 2,-14
	ASH 3,-30
	FLTR 3,3	;ALL SAMPLES MUST BE IN FLOATING POINT.
	MOVEM 3,(1)
	JRST UPCNT
HALFWD:	HLRE 3,2     	; GET LEFT HALF (1ST SAMPLE)
	FLTR 3,3
	MOVEM 3,(1)
;;	MOVEM 3,1(1)
	HRRE 3,2      	; GET RIGHT HALF - 2ND SMPL
	FLTR 3,3	; HRRE THE 'E'=EXTEND - KEEPS RIGHT SIGN.
	MOVEM 3,1(1)
UPCNT:	ADD 1,4		;MOVE UP ARRAY POINTER 2 OR 3
	CAIE 5,=511
	AOJA 5,UNPAC	;GO BACK FOR MORE
	JRA 16,2(16)

SETCOM:	HRRZ 6,0(16) 
	ADDI 6,=1023     ;READ 512 WDS INTO LAST 1/3 OF 1536 WD ARRAY.
	MOVEM 6,COM
;;	MOVEM 0,INARY#	 ;POINTS TO START OF INPUT
	MOVNI 0,=512
	HRLM 0,COM
	SETZM COM+1
	POPJ 17,

.ERROR:	0
	OUTSTR [ASCIZ/?
/]				;MAKE SURE HE CAN SEE HIS ERROR
	OUTSTR @(16)		;OUTPUT ERROR MESSAGE
	CALLI 1,12		;LET USER CONTINUE
	JRA 16,1(16)

	BLKS←←=1

REGS:	BLOCK 20
;CALL PUTEXT(<FILE>,<EXT>)

PUTEXT:	0	;USES EXTOUT,FINEXT, CH 
	MOVE 0,@0(16)
;	MOVEM 0,FILNAM
	MOVEM 0,DIR		;THE OUTPUT NAME (SIXBIT)
	MOVE 0,@1(16)
;	MOVEM 0,EXTNAM
	MOVEM 0,DIR+1		;THE EXTENSION (SIXBIT)
;	JSA 16,INTFIL
	MOVEI REGS
	BLT REGS+3
	INIT CH ,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	SETZM DIR+2
	SETZM DIR+3
	ENTER CH ,DIR
	ERROR <ENTER FAILED>
	JRA 16,2(16)

;CALL EXTOUT(<ARRAY>,<NO. OF WORDS>)

EXTOUT:	0
	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVN 0,@1(16)
	HRLM 0,COM
	OUTPUT CH ,COM
	STATZ CH ,740000
	ERROR <WRITE ERROR>
	JRA 16,2(16)


INTFIL:	0	;INITS DSK 
	MOVEI REGS
	BLT REGS+3
	INIT CH ,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
INTF8:	MOVE 0,FILNAM#
	MOVEM 0,FN#
	MOVE 1,[POINT 7,FN]
INTF7:	MOVE 2,[POINT 6,DIR]
	SETZM DIR
	MOVEI 3,5
INTF5:	ILDB 0,1
	CAIN 0," "
	JRST INTF6
	SUBI 0,40
	IDPB 0,2
	SOJG 3,INTF5
INTF6:	HRLZI REGS
	BLT 3
	MOVE 0,EXTNAM#
	MOVEM 0,EX#
	MOVE 1,[POINT 7,EX]
EXTF3:	MOVE 2,[POINT 6,DIR+1]
	SETZM DIR+1
	MOVEI 3,5
EXTF1:	ILDB 0,1
	CAIN 0," "
	JRST EXTF2
	SUBI 0,40
	IDPB 0,2
	SOJG 3,EXTF1
EXTF2:	HRLZI REGS
	BLT 3
	JRA 16,0(16)


;CALL FINEXT
FINEXT:	0
	CLOSE CH ,0
	STATZ CH ,740000
	ERROR <ERROR AFTER CLOSE>
	RELEASE CH ,0
	JRA 16,0(16)

;CALL GETEXT(<FILE>,<EXT>)

GETEXT:	0
	MOVE 0,@0(16)
	MOVEM 0,FILNAM
	MOVE 0,@1(16)
	MOVEM 0,EXTNAM
	JSA 16,INTFIZ
	SETZM DIR+3
	SETZM DIR+2
	LOOKUP CHG,DIR
	ERROR <LOOKUP FAILED>
	JRA 16,2(16)


INTFIZ:	0	;INITS DSK FOR INPUT
	MOVEI REGS
	BLT REGS+3
	INIT CHG,17
	SIXBIT/DSK/
	0
	ERROR <CAN'T INIT DSK!>
	JRST INTF8


;CALL EXTIN(<ARRAY>,<NO. WORDS>)

EXTIN:	0
	HRRZ 0,0(16)
	SUBI 0,1
	MOVEM 0,COM
	MOVN 0,@1(16)
	HRLM 0,COM
	INPUT CHG,COM
	STATZ CHG,740000
	0
	JRA 16,2(16)
	END